/* 
 * Copyright [2018] [Alex/libo(liboms@hotmail.com)]
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.hyts.template.common;

import java.util.Map;

import com.hyts.template.config.JavaTemplateConfig;

/**
 * @title JavaFileTemplate.java
 * @package com.hyts.template.common
 * @description Java代码代码生成器模板接口类
 * @author libo/Alex
 * @email liboms@hotmail.com/liboware@163.com  
 * @date 2018年5月7日
 * @version V1.0
 */
public interface BaseJavaFileTemplate {

	/**
	 * <p>最后的Java代码</p>
	 * @fieldName javaCode
	 * @fieldType StringBuilder
	 */
	StringBuilder javaCode = new StringBuilder();

	/**
	 * <b>genTypeContent</b>
	 * <p>创建类名称</p>
	 * @param accessType
	 * @param className
	 * @return
	 * @exception
	 */
	abstract String genTypeContent(
			JavaTemplateConfig.JavaType javaType,String accessType,String className,String... annotations);

	/**
	 * @name javaCode's getter method
	 * @return javaCode
	 */
	default StringBuilder getJavaCode() {
		return javaCode;
	}

	/**
	 * <b>genPackageContent:获取包名内容</b>
	 * <p>返回包名称结构操作方法全局限定名</p>
	 * @param baseProject 基础项目架构包 比如 com.xxx.xxx 这个级别的一般
	 * @param modelName 模块名称 在基础架构包之后的下一级包名称
	 * @return 返回包名称结构操作方法全局限定名-一个类基本执行一次
	 */
	abstract String genPackageContent(String baseProject,String... modelName);

	/**
	 * <b>genImportContent引入多个引用信息路径类</b>
	 * <p>引入多个引用信息类路径</p>
	 * @param importClassPath
	 * @return 引入多个引用信息类路径-一个类基本执行一次
	 */
	abstract String genImportContent(String... importClassPath);

	/**
	 * <b>genJavaDocContent:创建javaDoc的格式模板,里面的内容由key-value决定</b>
	 * <p>
	 * 	  创建javaDoc的格式模板,里面的内容由key-value决定
	 *   key尽量保持@开头 并且为javadoc规范的字段
	 * </p>
	 * @param params key/value结构信息键值对集合
	 * @return 返回javaDoc内容信息，一个类-可以多次调用
	 */
	abstract String genJavaDocContent(Map<String,String> params,String headSpace);

	/**
	 * <b>genJavaCommentContent：创建java注释，
	 * 	 此方法可用可不用，一般生产代码中较少出现，起提醒作用</b>
	 * <p>创建java注释，此方法可用可不用，一般生产代码中较少出现，起提醒作用</p>
	 * @param params key/value结构信息键值对集合
	 * @return 返回javaDoc内容信息，一个类-可以多次调用
	 */
	abstract String genJavaCommentContent(Map<String,String> params,String headSpace);

	/**
	 * <b>genFieldContent:创建field字段代码</b>
	 * <p>一般创建字段时候使用</p>
	 * @return 返回field内容信息，一个类-可以多次调用
	 */
	abstract String genFieldContent(String accessType,String returnType,String fieldName,String headSpace,String... annotations);

	/**
	 * <b>genMethodContent:创建method方法代码</b>
	 * <p>一般创建setter/getter或者构造器方法</p>
	 * @return 返回method内容信息，一个类-可以多次调用
	 */
	abstract String genMethodContent(String accessType,String returnType,
									 String methodName,Map<String,String> paramList,
									 String functionBody,String headSpace,
									 String... annotations);


	abstract String genMethodContent(String accessType,String returnType,
									 String methodName,Map<String,String> paramList,
									 String functionBody,String headSpace,boolean isInterface,
									 String... annotations);

	default StringBuilder end(){
		return (this.javaCode.toString().endsWith("}"))?
				this.javaCode:this.javaCode.append("\n}");
	}



	default void flushJavaCode(){
		this.javaCode.delete(0,this.javaCode.length());
	}

}
